<?php
interface IInitData
{
	static function Initdata();
}

abstract class DataTemplate
{
	protected $header;
	protected $data;
	
	protected $initLineNum;
	
	public function __construct()
	{
	}
	
	public function __get( $property ) 
	{
		if ( ! array_key_exists( $property, $this->data ) ) {
			$err_msg = "(".__CLASS__.")->".$property." is not exist!";
			debug_log( $err_msg );
			return null;
		}
		return $this->data[$property];
	}
	
	/**
     * 后期静态绑定类的名称
     */
	static function GetClassName(){
		return get_called_class();
	}
	
	/**
     * 得到指定id的实例的key。 
     */
    public function getKeyID( $id )
    {
    	return sprintf("%s_%u", get_class( $this ), isset( $id ) ? $id : 0 );
    }

    /**
     * 得到该表的总项数的key。  
     */
	public function getKeyNum()
	{
		return sprintf( "%s_NUM", get_class( $this ) );
	}
	
    // 得到该表的总项数。 
    public function getNum()
    {
        return apc_fetch( $this->getKeyNum() );
    }
	
	/**
	 * 解析CSV中一行数据，写入APC中。 
	 * @param $line array CSV中一行数据
	 * @param $count 行数
	 */
	function parse( $line, $count )
	{
		$this->data = array();
        $index = 0;
        
        // 第一行字符串索引忽略。 
	   	// if ( !( preg_match( "/^\d+/", $str[$index] ) ) ) {
       	//    return false;
       	// }
      	if ( $count == 0 ) {
      		$this->header = $line;
      	}
        
        // 根据域作为key将相关数据写入data中。 
        $fields = $this->GetFields();
        foreach ( $fields as $header ) {
			if ( ! isset( $str[$index] ) ) {
				$class_name = get_class( $this );
				debug_print_r( "$class_name Parse failed : $line" );
	            return false;
	        }
	        
	        $this->data[$header] = $str[$index++];
        }
        return true;
	}
	
    
    /**
     * 得到指定id的实例 （CSV的ID项）。 
     * @param $id 
     */
	public function getTemplate( $id )
	{
        $this->data = apc_fetch( $this->GetKeyID( $id ) );
        if ( ! $this->data ) {
            return NULL;
        }
        return $this;
	}
    
	/**
	 * 该类所有域，对应CSV的表头。 
	 * 一行5个 
	 * 例: 
   */
	 	public function getFields()
	 	{
	 		return array( 	'ID', 'Name', 'Grouping', 'Level', 'Rarity',
	    					'Effect', 'EffectiveDose', 'StillID', 'GoldPrice', 'CashPrice',
					    	'GPPrice', 'RuinsFlag', 'GoldFlag', 'CashFlag', 'GPFlag',
					    	'AvailableFlag', 'WorkFlag1', 'WorkFlag2', 'WorkFlag3' );
		}
    
    abstract public function getFields();
    

    /**
     * 初始化CSVdata数据，向APC中写入。 
     * @param $file_path 目标CSV路径 
     * @param $class 对应的类 
     */
    public static function Initdata( $file_path, $class )
    {
        $fp = fopen( $file_path, "rt" );
        if ( ! $fp ) {
            return false;
        }
		
		
        
        $datawork = new $class;
        $count = 0;
    	$array_header = array();
        while ( ! feof( $fp ) ) {
            // $s = fgets( $fp );
            // $s = rtrim( $s );		// 删除换行符 
            $line = fgetcsv($fp);	// 从文件指针中读入一行并解析 CSV 字段
	      	if ( $count == 0 ) {
    			$array_header = $line;
	      	}
			
	      	$datawork->header = $array_header;
            // 每行解析 
            if ( ! $datawork->Parse( $line, $count ) ) {
                continue;
            }
            
            // 每条记录存入APC 
            if ( ! apc_store( $datawork->GetKeyID( $datawork->data['ID'] ), $datawork->data ) ) {
                fclose( $fp );
                return false;
            }
            $count++;
        }
        fclose( $fp );
        
        // 记录总数存入APC 
        if ( ! apc_store( $datawork->GetKeyNum(), $count ) ) {
            return false;
        }

        return true;
    }
}


?>